home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / pctchnqs / 1992 / number1 / prfile.cpp < prev    next >
C/C++ Source or Header  |  1992-01-05  |  5KB  |  259 lines

  1. #include <bios.h>
  2. #include <dos.h>
  3. #include <string.h>
  4.  
  5. #define Uses_TApplication
  6. #define Uses_TButton
  7. #define Uses_TDeskTop
  8. #define Uses_TDialog
  9. #define Uses_TEvent
  10. #define Uses_TLabel
  11. #define Uses_TProgram
  12. #define Uses_TRadioButtons
  13. #define Uses_TSItem
  14. #define Uses_TView
  15. #include <tv.h>
  16.  
  17. #include "fileview.h"
  18. #include "prfile.h"
  19.  
  20. int TFileViewer::filesOpen = 0;
  21.  
  22. void TFileViewer::handleEvent(TEvent& event)
  23. {
  24. TScroller::handleEvent(event);
  25. if (event.what == evCommand)
  26.   switch (event.message.command)
  27.     {
  28.     case cmPrintFile:
  29.       printFile();
  30.       clearEvent( event );
  31.       break;
  32.     }
  33. }
  34.  
  35. TPrintFile::TPrintFile(const char *name) : TObject(),
  36. _name(newStr(name))
  37. {
  38. }
  39.  
  40. TPrintFile::~TPrintFile()
  41. {
  42. delete _name;
  43. }
  44.  
  45. TPrintQueue::TPrintQueue(int port) : TNSCollection(10, 5),
  46. _port(port - 1), bufend(buffer), bufptr(buffer), dialogOpen(False)
  47. {
  48. }
  49.  
  50. void TPrintQueue::removeFile()
  51. {
  52. delete (TPrintFile*)at(0);
  53. atRemove(0);
  54. }
  55.  
  56. void TPrintQueue::removeAll()
  57. {
  58. while (count)
  59.   removeFile();
  60. }
  61.  
  62. Boolean TPrintQueue::cancel()
  63. {
  64. Boolean cancelled;
  65.  
  66. // Queue active if files remaining or buffer not empty.
  67. if (count || bufptr != bufend)
  68.   {
  69.   TDialog *errdlg = new TDialog(TRect(0, 0, 29, 8),
  70.                 "Printer Warning");
  71.   errdlg->options |= ofCentered;
  72.  
  73.   if (errdlg)
  74.     {
  75.     errdlg->insert(new TLabel(TRect(1, 1, 27, 2),
  76.                   "Print queue is not empty.", 0));
  77.     errdlg->insert(new TLabel(TRect(1, 2, 24, 3),
  78.                   "Exiting will purge all", 0));
  79.     errdlg->insert(new TLabel(TRect(1, 3, 13, 4),
  80.                   "print jobs.", 0));
  81.  
  82.     errdlg->insert(new TButton(TRect(1, 5, 13, 7), "E~x~it",
  83.                    cmOK, bfNormal));
  84.     errdlg->insert(new TButton(TRect(15, 5, 27, 7), "Cancel",
  85.                    cmCancel, bfDefault));
  86.  
  87.     if (lowMemory())
  88.       {
  89.       destroy(errdlg);
  90.       cancelled = True;
  91.       }
  92.     else
  93.       {
  94.       // Alert user with error tone.
  95.       sound(880);
  96.       delay(100);
  97.       sound(554);
  98.       delay(100);
  99.       nosound();
  100.  
  101.       switch (TProgram::deskTop->execView(errdlg))
  102.     {
  103.     case cmCancel:
  104.       cancelled = False;
  105.       break;
  106.  
  107.     case cmOK:
  108.       cancelled = True;
  109.       break;
  110.     }
  111.  
  112.       destroy(errdlg);
  113.       }
  114.     }
  115.  
  116.   if (cancelled)
  117.     removeAll();
  118.   }
  119. else
  120.   cancelled = True;
  121.  
  122. return (cancelled);
  123. }
  124.  
  125. void TPrintQueue::print()
  126. {
  127. if (bufptr != bufend)
  128.   for (int i = 0, printOk = True; i < 100 && bufptr != bufend &&
  129.        printOk; i++)
  130.     {
  131.     char *errmessage = 0;
  132.     int printStat = biosprint(readStatus, 0, _port);
  133.  
  134.     if (printStat & outOfPaper)
  135.       errmessage = "Out of paper.";
  136.     else if (!(printStat & selected))
  137.       errmessage = "Offline.";
  138.     else if (printStat & (timeOut | ioError))
  139.       errmessage = "I/O error.";
  140.     else if (printStat & notBusy)
  141.       // If the dialog box is open (user is being asked to reply to
  142.       // an error), error has been cleared so clear dialog box.
  143.       if (dialogOpen)
  144.     {
  145.     TEvent cancelEvent;
  146.  
  147.     cancelEvent.what = evCommand;
  148.     cancelEvent.message.command = cmCancel;
  149.     cancelEvent.message.infoPtr = 0;
  150.     TProgram::application->putEvent(cancelEvent);
  151.  
  152.     // Instead of putEvent(), could also use:
  153.     // message(TProgram::application, evCommand, cmCancel, 0);
  154.  
  155.     // Abort this invocation of the idle() routine.
  156.     printOk = False;
  157.     }
  158.       else
  159.     biosprint(printChar, *bufptr++, _port);
  160.  
  161.     if (errmessage)
  162.       // If dialogOpen is True, this test will fail anyway.
  163.       if (TProgram::application->TopView() == TProgram::application)
  164.     {
  165.     TDialog *errdlg = new TDialog(TRect(0, 0, 35, 5),
  166.                       "Printer Error");
  167.     errdlg->options |= ofCentered;
  168.  
  169.     if (errdlg)
  170.       {
  171.       errdlg->insert(new TLabel(TRect(1, 1, strlen(errmessage) +
  172.                       2, 2), errmessage, 0));
  173.  
  174.       errdlg->insert(new TRadioButtons(TRect(16, 1, 33, 4),
  175.              new TSItem("~R~etry",
  176.              new TSItem("~C~ancel file",
  177.              new TSItem("~P~urge queue", 0)))));
  178.  
  179.       errdlg->insert(new TButton(TRect(1, 2, 15, 4), "O~K~",
  180.                      cmOK, bfDefault));
  181.  
  182.       if (lowMemory())
  183.         {
  184.         destroy(errdlg);
  185.         printOk = False;
  186.         }
  187.       else
  188.         {
  189.         ushort response = 0;
  190.         errdlg->setData(&response);
  191.  
  192.         // Alert user with error tone.
  193.         sound(880);
  194.         delay(100);
  195.         sound(554);
  196.         delay(100);
  197.         nosound();
  198.  
  199.         dialogOpen = True;
  200.         switch (TProgram::deskTop->execView(errdlg))
  201.           {
  202.           case cmCancel:
  203.         break;
  204.  
  205.           case cmOK:
  206.         errdlg->getData(&response);
  207.         switch (response)
  208.           {
  209.           case 0:
  210.             break;
  211.  
  212.           case 2:
  213.             removeAll();
  214.  
  215.           case 1:
  216.             f.close();
  217.             bufptr = bufend;
  218.             break;
  219.           }
  220.         break;
  221.           }
  222.  
  223.         destroy(errdlg);
  224.         dialogOpen = False;
  225.         }
  226.       }
  227.     }
  228.       else
  229.     // Application is not modal view; wait until it is.
  230.     printOk = False;
  231.     }
  232. else if (f.rdbuf()->is_open())
  233.   {
  234.   f.read(buffer, sizeof(buffer));
  235.   bufend = buffer + f.gcount();
  236.   bufptr = buffer;
  237.  
  238.   // If end of file, close file and add formfeed.
  239.   if (bufend != buffer + sizeof(buffer))
  240.     {
  241.     f.close();
  242.     *bufend++ = '\f';
  243.     }
  244.   }
  245. else if (count)
  246.   {
  247.   f.open(((TPrintFile*)at(0))->name(), ios::in | ios::binary);
  248.   removeFile();
  249.   }
  250. }
  251.  
  252. // Create print queue on port LPT1.
  253. TPrintQueue TPrintQueue::printQueue(1);
  254.  
  255. void TFileViewer::printFile()
  256. {
  257. TPrintQueue::printQueue.insert(new TPrintFile(fileName));
  258. }
  259.